/**
 * @package Infinity-Seed
 *
 * @copyright Copyright (C) 2012-2013 Exia.CESI
 * @author Paul MAGNIN, Arthur MERCIER, Jordan RICHET, Cyril SCHUMACHER
 */
package infinity.seed;

import java.awt.Font;
import java.awt.FontFormatException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Création de police personnalisée.
 * @author Cyril SCHUMACHER <cyril.schumacher at viacesi.fr>
 */
public class CustomFont {
    // <editor-fold defaultstate="collapsed" desc="Attributs.">
    /**
     * Liste contenant les polices utilisés récemment.
     * Evite de créer des instances qui existent déjà.
     */
    private HashMap<String,Font> _fonts;
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Constructeur.">
    /**
     * Constructeur.
     */
    public CustomFont() {
        this._fonts = new HashMap<>();
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Créer une police personnalisée.">
    /**
     * Créer une police personnalisée.
     * @param path Chemin de la police.
     * @param size Taille de la police.
     * @return Retourne une instance de la classe Font, null si une erreur
     * survient.
     * @see CustomFont#getFont()
     */
    public Font getFont(String path, Integer size) {
        return this.getFont(path, size, Font.TRUETYPE_FONT);
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Créer une police personnalisée.">
    /**
     * Créer une police personnalisée.
     * Cette méthode est surchargée : le développeur à la possibilité de définir le format de la police.
     * @param path Chemin de la police.
     * @param size Taille de la police.
     * @param fontFormat Format de la police.
     * @return Retourne une instance de la classe Font, null si une erreur survient.
     * @see <a href="http://docs.oracle.com/javase/7/docs/api/java/awt/Font.html">Font</a>
     * @see <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html">InputStream</a>
     */
    public Font getFont(String path, Integer size, int fontFormat) {
        // Si la police n'a jamais été utilisé, on recupère les données.
        if (this._fonts.containsKey(path) == false) {
            InputStream stream;
            try {
                // Récupère les données du fichier.
                stream = getClass().getResource(path).openStream();
                this._fonts.put(path, Font.createFont(fontFormat, stream));
                stream.close();
            }
            catch(FontFormatException|IOException e) {
                Logger.getLogger(Configuration.class.getName()).log(Level.WARNING, null, e);
                return null;
            }
        }
        
        Font customFont = this._fonts.get(path);
        return customFont.deriveFont(fontFormat, size);
    }
    // </editor-fold>
    // </editor-fold>
}
